package com.dolojia.javafxboot.util;

import javafx.concurrent.Worker.State;
import javafx.fxml.FXMLLoader;
import javafx.scene.Node;
import javafx.scene.control.Label;
import javafx.scene.control.ProgressIndicator;
import javafx.scene.control.ScrollPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;

import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class ViewLoader {

    // 缓存已加载的视图
    private static final Map<String, Node> viewCache = new HashMap<>();

    /**
     * 加载FXML视图到指定容器
     *
     * @param container  内容容器
     * @param titleLabel 标题标签
     * @param fxmlPath   FXML文件路径
     * @param titleText  视图标题
     */
    public static void loadFXMLView(ScrollPane container, Label titleLabel, String fxmlPath, String titleText) {
        try {
            // 检查缓存
            Node view = viewCache.get(fxmlPath);
            if (view == null) {
                // 加载新视图
                URL location = ViewLoader.class.getResource(fxmlPath);
                if (location == null) {
                    throw new IOException("无法找到FXML文件: " + fxmlPath);
                }
                view = FXMLLoader.load(location);
                // 添加到缓存
                viewCache.put(fxmlPath, view);
            }

            // 设置视图
            container.setContent(view);
            titleLabel.setText(titleText);

        } catch (IOException e) {
            e.printStackTrace();
            // 显示错误信息
            container.setContent(createErrorView("加载视图失败: " + e.getMessage()));
            titleLabel.setText("错误");
        }
    }

    /**
     * 加载WebView到指定容器
     *
     * @param container  内容容器
     * @param titleLabel 标题标签
     * @param url        要加载的URL
     * @param titleText  视图标题
     */
    public static void loadWebView(ScrollPane container, Label titleLabel, String url, String titleText) {
        // 创建或获取缓存的WebView
        WebView webView = (WebView) viewCache.get(url);
        if (webView == null) {
            // 创建新的WebView
            webView = new WebView();
            WebEngine engine = webView.getEngine();

            // 设置JavaScript支持
            engine.setJavaScriptEnabled(true);

            // 绑定尺寸
            webView.prefWidthProperty().bind(container.widthProperty());
            webView.prefHeightProperty().bind(container.heightProperty());

            // 添加进度监听
            ProgressIndicator progress = new ProgressIndicator();
            progress.setVisible(false);

            WebView finalWebView = webView;
            engine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
                if (newState == State.RUNNING) {
                    container.setContent(progress);
                    progress.setVisible(true);
                } else if (newState == State.SUCCEEDED) {
                    container.setContent(finalWebView);
                    progress.setVisible(false);
                } else if (newState == State.FAILED) {
                    container.setContent(createErrorView("界面加载失败: " + engine.getLocation()));
                    progress.setVisible(false);
                }
            });
            // 加载URL
            engine.load(url);
            // 添加到缓存
            viewCache.put(url, webView);
        }
        // 设置视图
        container.setContent(webView);
        titleLabel.setText(titleText);
    }

    /**
     * 清理WebView资源
     */
    public static void clearWebViewCache() {
        for (Map.Entry<String, Node> entry : viewCache.entrySet()) {
            if (entry.getValue() instanceof WebView) {
                WebView webView = (WebView) entry.getValue();
                webView.getEngine().load(null); // 释放资源
            }
        }
        viewCache.clear();
    }

    /**
     * 创建错误视图
     */
    private static Node createErrorView(String message) {
        // 实际项目中可以返回一个自定义的错误信息面板
        return new javafx.scene.control.Label("错误: " + message);
    }
}